/////////////////////////////////////////////////////////////////////////////
// Name:        checkedlistctrl.h
// Purpose:     wxCheckedListCtrl
// Author:      Uknown ? (found at http://wiki.wxwidgets.org/wiki.pl?WxListCtrl)
// Modified by: Francesco Montorsi
// Created:     2005/06/29
// RCS-ID:      $Id$
// Copyright:   (c) 2005 Francesco Montorsi
// Licence:     wxWidgets licence
/////////////////////////////////////////////////////////////////////////////


#ifndef _WX_CHECKEDLISTCTRL_H_
#define _WX_CHECKEDLISTCTRL_H_

// wxWidgets headers
#include "wx/webupdatedef.h"        // for the WXDLLIMPEXP_WEBUPDATE macro
#include <wx/listctrl.h>
#include <wx/imaglist.h>

#if wxUSE_CHECKEDLISTCTRL

// image indexes (used internally by wxCheckedListCtrl)
#define wxCLC_UNCHECKED_IMGIDX              0       // unchecked & enabled
#define wxCLC_CHECKED_IMGIDX                1       // checked & enabled
#define wxCLC_DISABLED_UNCHECKED_IMGIDX     2       // unchecked & disabled
#define wxCLC_DISABLED_CHECKED_IMGIDX       3       // checked & disabled

// additional state flags (wx's defines should end at 0x0100; see listbase.h)
#define wxLIST_STATE_CHECKED                0x010000
#define wxLIST_STATE_ENABLED                0x100000

// additional wxCheckedListCtrl style flags
// (wx's defines should at 0x8000; see listbase.h)
#define wxCLC_CHECK_WHEN_SELECTING          0x10000


// -------------------------
// wxCheckedListCtrl events
// -------------------------

DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_WEBUPDATE, wxEVT_COMMAND_LIST_ITEM_CHECKED, -1);
DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_WEBUPDATE, wxEVT_COMMAND_LIST_ITEM_UNCHECKED, -1);

#define EVT_LIST_ITEM_CHECKED(id, fn) \
    DECLARE_EVENT_TABLE_ENTRY( \
        wxEVT_COMMAND_LIST_ITEM_CHECKED, id, -1, \
        (wxObjectEventFunction)(wxEventFunction)(wxListEventFunction)&fn, \
        (wxObject *) NULL \
    ),

#define EVT_LIST_ITEM_UNCHECKED(id, fn) \
    DECLARE_EVENT_TABLE_ENTRY( \
        wxEVT_COMMAND_LIST_ITEM_UNCHECKED, id, -1, \
        (wxObjectEventFunction)(wxEventFunction)(wxListEventFunction)&fn, \
        (wxObject *) NULL \
    ),



//! This is the class which performs all transactions with the server.
//! It uses the wxSocket facilities.
class WXDLLIMPEXP_WEBUPDATE wxCheckedListCtrl : public wxListCtrl
{
protected:

	// we have to keep a different array to keep track of the additional
	// states we support....
	wxArrayInt m_stateList;

	// our set of checkbox images...
	wxImageList m_imageList;

public:
	wxCheckedListCtrl()
#if CLC_VBAM_USAGE && CLC_USE_SYSICONS
		: wxListCtrl(), m_imageList() {}
#else
		: wxListCtrl(), m_imageList(16, 16, TRUE) {}
#endif

	wxCheckedListCtrl(wxWindow* parent, wxWindowID id = -1,
	                  const wxPoint &pt = wxDefaultPosition,
	                  const wxSize &sz = wxDefaultSize,
	                  long style = wxCLC_CHECK_WHEN_SELECTING,
	                  const wxValidator &validator = wxDefaultValidator,
	                  const wxString &name = wxListCtrlNameStr)
#if CLC_VBAM_USAGE && CLC_USE_SYSICONS
		: wxListCtrl(), m_imageList()
#else
		: wxListCtrl(), m_imageList(16, 16, TRUE)
#endif
	{ Create(parent, id, pt, sz, style, validator, name); }

	bool Create(wxWindow* parent, wxWindowID id = -1,
	            const wxPoint &pt = wxDefaultPosition,
	            const wxSize &sz = wxDefaultSize,
	            long style = wxCLC_CHECK_WHEN_SELECTING,
	            const wxValidator &validator = wxDefaultValidator,
	            const wxString &name = wxListCtrlNameStr);

#ifdef CLC_VBAM_USAGE
	// for xrc usage, a separate init function is needed.
	bool Init();
#endif
	virtual ~wxCheckedListCtrl() {}


public:         // utilities

	// core overloads (i.e. the most generic overloads)
	bool GetItem(wxListItem &info) const;
	bool SetItem(wxListItem &info);
	long InsertItem(wxListItem &info);
	bool DeleteItem(long item);
	bool DeleteAllItems()
	{ m_stateList.Clear(); return wxListCtrl::DeleteAllItems(); }

	bool SortItems(wxListCtrlCompare, long)
	{ wxASSERT_MSG(0, wxT("Not implemented yet ! sorry... ")); return FALSE; }

	// shortcuts to the SetItemState function
	void Check(long item, bool checked);
	void Enable(long item, bool enable);
	void CheckAll(bool checked = true);
	void EnableAll(bool enable = true);

	// this needs to be redeclared otherwise it's hidden by our other Enable() function.
	// However you should use #EnableAll instead of this function if you want to get
	// good graphics (try to understand)
	virtual bool Enable(bool enable = true)
	{ return wxListCtrl::Enable(enable); }

	// shortcuts to the GetItemState function
	bool IsChecked(long item) const
	{ return GetItemState(item, wxLIST_STATE_CHECKED) != 0; }
	bool IsEnabled(long item) const
	{ return GetItemState(item, wxLIST_STATE_ENABLED) != 0; }

	// this needs to be redeclared otherwise it's hidden by our other IsEnabled() function.
	bool IsEnabled() const
	{ return wxWindow::IsEnabled(); }

	//! Returns the number of checked items in the control.
	int GetCheckedItemCount() const;

	// we overload these so we are sure they will use our
	// #GetItem and #SetItem functions...
	bool SetItemState(long item, long state, long stateMask);
	int GetItemState(long item, long stateMask) const;
	long InsertItem(long index, const wxString &label, int imageIndex = -1);
	long SetItem(long index, int col, const wxString &label, int imageId = -1);

	// the image associated with an element is already in used by wxCheckedListCtrl
	// itself to show the checkbox and it cannot be handled by the user !
	bool SetItemImage(long, int)
	{ wxASSERT_MSG(0, wxT("This function cannot be used with wxCheckedListCtrl !")); return FALSE; }

protected:      // event handlers

	void OnMouseEvent(wxMouseEvent &event);

protected:      // internal utilities

	static int GetItemImageFromAdditionalState(int addstate);
	static int GetAndRemoveAdditionalState(long* state, int statemask);
	wxColour GetBgColourFromAdditionalState(int additionalstate);

private:
#if CLC_VBAM_USAGE
	DECLARE_DYNAMIC_CLASS(wxCheckedListCtrl)
#else
	DECLARE_CLASS(wxCheckedListCtrl)
#endif
	DECLARE_EVENT_TABLE()
};


#endif  // wxUSE_CHECKEDLISTCTRL

#endif  // _WX_CHECKEDLISTCTRL_H_

